package co.edu.uniandes.services;

import java.sql.Connection;
import java.sql.DriverManager;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

/**
 * Se encarga del manejo de la conexion con la base de datos
 * 
 * @author Rafael Guillermo Blanco Banquez <rafaelg.blancob@gmail.com>
 * 
 */
public class ConexionBD {

	/**
	 * Unica conexion que va a manejar el sistema
	 */
	private static ConexionBD servicio;
	/**
	 * Conexion a base de datos
	 */
	private Connection conexionBD;

	/**
	 * Nombre del driver que se va a utilizar para la conexion
	 */
	private final String DRIVERCLASS = "com.mysql.jdbc.Driver";
	/**
	 * URL DE CONEXION A LA BD
	 */
	// private final String CONNECTIONURLTHIN =
	// "jdbc:mysql://23.21.154.69:3306/tcp";
	// private final String CONNECTIONURLTHIN =
	// "jdbc:mysql://localhost:3306/raflanc1_tcp";
	private final String CONNECTIONURLTHIN = "jdbc:mysql://127.0.0.1:2022/raflanc1_tcp";
	/**
	 * USUARIO DE LA BD
	 */
	private final String USERID = "root";
	/**
	 * PASSWORD DE LA BD
	 */
	// private final String USERPASSWORD = "1.2.3.4.5.$";
	private final String USERPASSWORD = "123456";

	/**
	 * Contructor
	 */
	private ConexionBD() {
		
	}

	// Metodo para crear un tunel que permita conectarse al servidor remoto
	public void activarTunel() {

		String user = "usuario";
		String password = "masecos2012.";
		String remoteHost = "157.253.238.53";
		int localPort = 2022;
		int remotePort = 3306;
		Session session = null;

		try {

			JSch jsch = new JSch();
			session = jsch.getSession(user, remoteHost);
			session.setPassword(password);
			session.setConfig("StrictHostKeyChecking", "no");
			session.connect();
			session.setPortForwardingL(localPort, "127.0.0.1", remotePort);
			System.out.println("El tunel se ha creado");
		} catch (Exception ex) {
			System.out.println("Error al establecer tunel");
			ex.printStackTrace();
		}
	}

	/**
	 * Metodo que Retorna una Instacia de la Clase ServicioPais
	 */
	public static synchronized ConexionBD getInstance() {

		if (servicio == null) {
			servicio = new ConexionBD();
		}
		return servicio;
	}

	/**
	 * Metodo que Retorn la Conexion a la Base de Datos
	 * 
	 * @exception Se
	 *                lanza cuando se presentan problemas al crear la conexion
	 * @return
	 */
	public Connection getConection() throws Exception {
		activarTunel();
		if (conexionBD == null) {

			try {
				// Realizamos la Conexion con la Base de datos
				Class.forName(DRIVERCLASS);
				conexionBD = DriverManager.getConnection(CONNECTIONURLTHIN,
						USERID, USERPASSWORD);
			} catch (Exception e) {
				throw e;
			}
		}
		return conexionBD;

	}

}
